package lambda;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author shentianyu
 * @date 2021-06-16 17:11
 *
 * 方法引用：Lambda体中的内容已经有方法实现了，我们可以使用方法引用
 * 可以理解为方法引用是lambda表达式的另外一种表现形式
 *
 * 对象::实例方法名
 *
 * 类名::静态方法名
 *
 * 类名::实例方法名
 *
 */
public class TestMethodRef {
    public static void main(String[] args) {
        Consumer<String> con1 = (x) -> System.out.println(x);

        //方法引用，引用方法的参数列表和返回值类型要和接口中抽象方法的参数列表和返回值类型保持一致
        Consumer<String> con2 = System.out::println;

        Employee emp = new Employee("张三",20,2000.0);
        Supplier<String> sup1 = emp::getName;
        System.out.println(sup1.get());

        Supplier<Integer> sup2 = emp::getAge;
        System.out.println(sup2.get());

        Comparator<Integer> comparator = Integer::compareTo;

        //类名::实例方法名
        BiPredicate<String,String> biPredicate1 = (x,y)->x.equals(y);
        //第一个参数是方法的调用者，第二个参数是实例方法的参数时，可以使用
        BiPredicate<String,String> biPredicate2 = String::equals;
        System.out.println(biPredicate2.test("abc", "def"));



        //构造器引用
        //ClassName::new
        Supplier<Employee> supplier = ()->new Employee();
        Supplier<Employee> supplier1 = Employee::new;
        System.out.println(supplier1.get());

        Function<Integer,Employee> function = Employee::new;
        System.out.println(function.apply(10));

        Function<Integer,String[]> fun1 = String[]::new;
        System.out.println(fun1.apply(10).length);


    }
}
